//
//  HLENetWorkConfig.h
//  HLENetwork_Example
//
//  Created by hle1879 on 2020/9/28.
//  Copyright © 2020 13434436448@163.com. All rights reserved.
//

#import <Foundation/Foundation.h>

#ifndef dispatch_queue_async_safe
#define dispatch_queue_async_safe(queue, block)\
    if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\
        block();\
    } else {\
        dispatch_async(queue, block);\
    }
#endif

#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)
#endif

typedef NS_ENUM(NSUInteger, HLENetWorkNetStatus) {
    ///未知网络
    HLENetWorkStatusUnknow,
    ///无网络
    HLENetWorkStatusNotReachable,
    ///手机网络
    HLENetWorkStatusReachableViaWWAN,
    ///WiFi网络
    HLENetWorkStatusReachableViaWiFi
};

typedef NS_ENUM(NSUInteger, HLENetWorkCachePolicy) {
    /// 仅返回网络请求数据不做数据缓存处理
    HLECachePolicyRequestWithoutCahce = 0,
    /// 主要返回缓存数据并缓存网络请求的数据，缓存无数据时返回网络数据，第一次请求没有缓存数据时从网络先请求数据
    HLECachePolicyMainCacheSaveRequest,
    /// 仅返回缓存数据而不请求网络，数据第一次请求或缓存失效的情况下才会从网络请求数据并缓存一次
    HLECachePolicyOnlyCacheOnceRequest,
    /// 主要返回网络请求数据，请求失败或请求超时的情况下再返回请求成功时缓存的数据
    HLECachePolicyMainRequestFailCache,
    /// 网络请求数据和缓存数据共同返回
    HLECachePolicyRequsetAndCache
};

typedef NS_ENUM(NSUInteger, HLENetWorkRequestMethod) {
    /// GET请求
    HLERequestMethodGET = 0,
    /// POST请求
    HLERequestMethodPOST,
    /// HEAD请求
    HLERequestMethodHEAD,
    /// PUT请求
    HLERequestMethodPUT,
    /// PATCH请求
    HLERequestMethodPATCH,
    /// DELETE请求
    HLERequestMethodDELETE
};

typedef NS_ENUM(NSUInteger, HLERequestSerializer) {
    /// 数据请求格式默认 不做自定义设置  默认HTTP格式
    HLERequestSerializerDefault = 0,
    /// 设置数据请求格式为HTTP
    HLERequestSerializerHTTP,
    /// 设置数据请求格式为JSON
    HLERequestSerializerJSON
};

typedef NS_ENUM(NSUInteger, HLEResponseSerializer) {
    /// 数据响应格式默认 不做自定义设置  默认JSON格式 */
    HLEResponseSerializerDefault = 0,
    /// 设置数据响应格式为HTTP
    HLEResponseSerializerHTTP,
    /// 设置数据响应格式为JSON
    HLEResponseSerializerJSON
};

@class AFSecurityPolicy;

NS_ASSUME_NONNULL_BEGIN

@interface HLENetWorkConfig : NSObject

///设置请求的baseURL，默认nil
@property (nonatomic, strong, nullable) NSURL *baseURL;

/// 设置请求数据格式  默认HTTP二进制
@property (nonatomic,assign) HLERequestSerializer requestSerializer;

/// 设置响应数据格式 默认JSON格式
@property (nonatomic,assign) HLEResponseSerializer responseSerializer;

/// 数据请求的超时时间，默认60s
@property (nonatomic,assign)NSTimeInterval timeoutInterval;

/// 数据请求的请求头
@property (nonatomic,copy) NSDictionary <NSString *, NSString *> *requestHeader;

/// 数据请求的公共参数 参数相同会覆盖
@property (nonatomic,copy) NSDictionary *publicParams;

/// 数据缓存的参数中需要过滤掉的无用参数的key
@property (nonatomic,copy) NSArray *cacheNeedlessParamsForKeys;

/// 请求证书校验 默认defaultPolicy
@property (nonatomic,strong) AFSecurityPolicy *securityPolicy;

/// 默认缓存的位置
@property (nonatomic,copy) NSString *cachePath;

/// 状态栏等待指示器 默认不开启 
@property (nonatomic,assign) BOOL activityIndicatorOpen;

/// session的配置 默认defaultSessionConfiguration
@property (nonatomic,strong) NSURLSessionConfiguration *sessionConfiguration;

///配置允许接收的类型
@property (nonatomic,strong) NSSet *acceptableContentTypes;

/// 默认的配置
+ (instancetype)defaultConfig;

@end

NS_ASSUME_NONNULL_END
